/*************************************************************************
	> File Name: 4.N皇后问题
	> Author: 
	> Mail: 
	> Created Time: 
 ************************************************************************/
#include <iostream>
#include <vector>
using namespace std;

// 定义全局变量，用于记录解的数量
int count_solutions = 0;
// 打印棋盘
void printBoard(const vector<int>& board) {
    int N = board.size();
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < N; ++j) {
            if (board[i] == j) {
                cout << "Q ";
            } else {
                cout << ". ";
            }
        }
        cout << endl;
    }
    cout << endl;
}
// 检查皇后是否可以放置在board[row][col]位置
bool isSafe(const vector<int>& board, int row, int col) {
    int N = board.size();
    // 检查同一列上是否有皇后
    for (int i = 0; i < row; ++i) {
        if (board[i] == col) {
            return false;
        }
    }
    // 检查左上到右下对角线是否有皇后
    for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; --i, --j) {
        if (board[i] == j) {
            return false;
        }
    }
    // 检查右上到左下对角线是否有皇后
    for (int i = row - 1, j = col + 1; i >= 0 && j < N; --i, ++j) {
        if (board[i] == j) {
            return false;
        }
    }
    return true;
}

// 递归回溯函数，尝试在当前行放置皇后
void solveNQueens(vector<int>& board, int row) {
    int N = board.size();
    // 如果已经放置了N个皇后，找到了一个解
    if (row == N) {
        ++count_solutions;
        cout << "Solution " << count_solutions << ":\n";
        printBoard(board);
        return;
    }
    // 尝试在当前行的每一列放置皇后
    for (int col = 0; col < N; ++col) {
        if (isSafe(board, row, col)) {
            board[row] = col;  // 放置皇后
            solveNQueens(board, row + 1);  // 递归尝试下一行
            board[row] = -1;  // 回溯，重置当前行状态
        }
    }
}

// 主函数
int main() {
    int N;
    cout << "Enter the number of queens (N): ";
    cin >> N;
    vector<int> board(N, -1);  // 初始化棋盘，-1表示没有皇后
    solveNQueens(board, 0);  // 从第0行开始放置皇后
    cout << "Total solutions: " << count_solutions << endl;
    return 0;
}

